package main

import (
	"fmt"
	"net/http"
	"runtime"
	"time"
)

//奇怪的慢等待
func main() {
	httpClient := http.Client{
		Timeout: time.Second * 2, //设置httpClicent的超时时间，否则由于响应慢而一直堵塞
	}
	for {
		go func() {
			resp, err := httpClient.Get("https://www.github.com/")
			if err != nil {
				fmt.Printf("http.Get err: %v\n", err)
			} else {
				fmt.Printf(resp.Status)
			}

			// do something...
		}()

		time.Sleep(time.Second * 1)
		fmt.Println("goroutines: ", runtime.NumGoroutine())
	}
}

/*
在这个例子中，展示了一个 Go 语言中经典的事故场景。也就是一般我们会在应用程序中去调用第三方服务的接口。
但是第三方接口，有时候会很慢，久久不返回响应结果。恰好，Go 语言中默认的 http.Client 是没有设置超时时间的。
因此就会导致一直阻塞，一直阻塞就一直爽，Goroutine 自然也就持续暴涨，不断泄露，最终占满资源，导致事故。
*/
